import axios from 'axios'
import { ElMessage } from 'element-plus' // 使用 Element Plus 的消息提示

// 根据环境获取基础URL
const getBaseUrl = () => {
  return import.meta.env.VITE_API_BASE_URL
}

// 创建实例
const service = axios.create({
  baseURL: getBaseUrl(),
  timeout: 10000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    // 请求错误预处理
    ElMessage.error('请求发送失败，请检查网络')
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    
    // 自定义业务状态码处理（假设成功码为 200）
    if (res.code !== 200) {
      const errMsg = res.ElMessage || '请求处理失败'
      ElMessage.error(errMsg) // 显示后端返回的错误信息
      return Promise.reject(new Error(errMsg))
    }
    return res.data // 直接返回有效数据
  },
  error => {
    // HTTP 状态码错误处理
    let errElMessage = '请求异常，请重试'
    
    if (error.response) {
      // 根据 HTTP 状态码显示不同提示
      switch (error.response.status) {
        case 400:
          errElMessage = '请求参数错误'
          break
        case 401:
          errElMessage = '登录已过期，请重新登录'
          // 跳转到登录页
          window.location.href = '/login'
          break
        case 403:
          errElMessage = '没有权限访问'
          break
        case 404:
          errElMessage = '请求资源不存在'
          break
        case 500:
          errElMessage = '服务器内部错误'
          break
        default:
          errElMessage = `连接错误 ${error.response.status}`
      }
    } else if (error.request) {
      // 请求已发出但无响应
      errElMessage = '网络连接异常，请检查网络'
    } else {
      // 其他错误
      errElMessage = error.ElMessage || '未知错误'
    }

    ElMessage.error(errElMessage)
    return Promise.reject(error)
  }
)

// 封装通用请求方法（返回 Promise）
export const request = {
  get(url, params, config = {}) {
    return service.get(url, { params, ...config })
  },
  post(url, data, config = {}) {
    return service.post(url, data, config)
  },
  put(url, data, config = {}) {
    return service.put(url, data, config)
  },
  delete(url, config = {}) {
    return service.delete(url, config)
  }
}

export default request